from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker, declarative_base as sync_declarative_base
from sqlalchemy.ext.asyncio import create_async_engine, AsyncSession
from sqlalchemy.ext.declarative import declarative_base as async_declarative_base
from app.config import Settings  # 假设你有一个 Settings 类管理配置
SyncBase = sync_declarative_base()# 同步 ORM 基类
AsyncBase = async_declarative_base()# 异步 ORM 基类
# --------------------------------------
# ✅ 同步数据库（SQLite / MySQL）
# --------------------------------------
# 同步 SQLite（默认）
sync_sqlite_engine = create_engine(
    Settings.sqlite_sync_url,  # e.g. "sqlite:///./sync.db"
    echo=True,
    connect_args={"check_same_thread": False}  # 仅适用于 SQLite
)
# 同步 MySQL（可选替换）
sync_mysql_engine = create_engine(
    Settings.mysql_sync_url,  # e.g. "mysql+pymysql://user:password@localhost/db"
    echo=True,
    pool_pre_ping=True  # 防止连接断开
)

# 创建同步 session 工厂（按需选择 SQLite 或 MySQL）
SyncSessionLocal = sessionmaker(
    bind=sync_mysql_engine,  # ✅ 你也可以换成 sync_mysql_engine
    autocommit=False,
    autoflush=False
)
# --------------------------------------
# ✅ 异步数据库（SQLite / MySQL）
# --------------------------------------
# 异步 SQLite（默认）
async_sqlite_engine = create_async_engine(
    Settings.sqlite_url,  # e.g. "sqlite+aiosqlite:///./async.db"
    echo=True
)
# 异步 MySQL（可选替换）
async_mysql_engine = create_async_engine(
    Settings.database_url,  # e.g. "mysql+aiomysql://user:password@localhost/db"
    echo=True,
    pool_pre_ping=True
)
# 创建异步 session 工厂（按需选择 SQLite 或 MySQL）
AsyncSessionLocal = sessionmaker(
    bind=async_mysql_engine,  # ✅ 你也可以换成 async_mysql_engine
    class_=AsyncSession,
    expire_on_commit=False
)

# 同步 Session 提供器（FastAPI 依赖项）
def get_sync_session():
    db = SyncSessionLocal()
    try:
        yield db
    finally:
        db.close()
# 异步 Session 提供器（FastAPI 依赖项）
async def get_async_session():
    async with AsyncSessionLocal() as session:
        yield session
